#ifndef GY_CONTAINERTRANSFORM_H
#define GY_CONTAINERTRANSFORM_H

#include <QGraphicsItemGroup>
#include "Graphics/GY_Object.h"
#include "Graphics/BasicGraphics/GY_BasicsGraphicsObject.h"
#include "GY_ControlLibrary_global.h"
#include <QVariant>

class GY_CONTROLLIBRARY_EXPORT GY_ContainerTransform : public GY_Object , public QGraphicsItemGroup
{
    Q_OBJECT
public:
    explicit GY_ContainerTransform(const QString &guid,QGraphicsItem *pItem,QGraphicsItem *parent = nullptr);
    /**
     * @brief updateObjectName  更新项目名称
     * @param name 属性名称
     * @param value 项目名称QString
     * @return 返回更新是否成功
     */
//    bool updateObjectName(const QString &name, const QVariant &value);
    /**
     * @brief addItem 组中添加图元
     * @param item 图形
     * @return 是否添加成功
     */
//    virtual bool addItem(QGraphicsItem *pItem);
    /**
     * @brief getPath 获取图形形状
     * @return 图形形状
     */
    QPainterPath getPath();
    //!继承基类重写
    GY_Object * copyItem(const QString &guid = QString()) override;
    /**
     * @brief getOrderChildrens 得到子类图元
     * @return 子类图元
     */
    QVector<GY_Object*> getOrderChildrens();
    virtual bool addItem(GY_Object *pItem);
    /**
     * @brief removItem 移除组中的图元
     * @param guid 图元的guid
     * @return 是否移除成功
     */
    virtual bool removItem(const QString &guid);
    /**
     * @brief removItem 移除图元
     * @param pItem 图元指针
     * @return 是否移除成功
     */
    virtual bool removItem(const GY_Object *pItem);
    /**
     * @brief setChildProperty  设置子图形属性
     * @param guid 子图形GUID
     * @param propertyName 属性名称
     * @param value 属性值
     * @return
     */
    virtual bool setChildProperty(const QString& guid,const QString& propertyName,const QVariant &value);
    /**
     * @brief setRotationCenter 设置旋转中心点，如果没有设置则为默认中心点(0,0)
     * @param val
     * @return
     */
    bool setRotationCenter(const QPointF &val);
    /**
     * @brief isRotation 是否允许旋转
     * @return
     */
    bool isRotation() const;
    /**
     * @brief setIsRotation 是否允许旋转
     * @param isRotation
     */
    void setIsRotation(bool isRotation);
    /**
     * @brief scaleX 水平轴向的缩放比
     * @return
     */
    qreal scaleX() const;
    void setScaleX(const qreal &scaleX);
    /**
     * @brief scaleY 垂直方向上的缩放比
     * @return
     */
    qreal scaleY() const;
    void setScaleY(const qreal &scaleY);
    /**
     * @brief containerRotation 旋转角度
     * @return
     */
    qreal containerRotation() const;
    void setContainerRotation(const qreal &containerRotation);
    /**
     * @brief getIsContain 获取容器本身和容器下的子容器是否包含对象
     * @param guid 对象guid
     * @return  是否
     */
    bool getChildrenIsContain(const QString &guid);
    /**
     * @brief getIsContain 获取容器本身是否包含对象
     * @param guid 对象guid
     * @return  是否
     */
    bool getIsContain(const QString &guid);
    /**
     * @brief getScenePosition 获取场景位置
     * @return 场景位置
     */
    QPointF getScenePosition();
    /**
     * @brief getChildrensMap 获取存放子类图形map容器
     * @return 包含的图形
     */
    QMap<QString,GY_Object*> getChildrensMap();
    /**
     * @brief setChildObjName 在复制组中，如果是容器设置容器下面所有名称
     * @param index 名称序列号
     */
    void setChildObjName(const QString& index);
    /**
     * @brief setTapeCircularChildObjName 在复制组中且在tapecircular中，如果是容器设置容器下面所有名称
     * @param index 名称序列号
     */
    void setTapeCircularChildObjName(const QString& index);
    /**
     * @brief setChildRepeatNum 设置RepeatGroup复制个数
     * @param num 复制个数
     */
    void setChildRepeatNum(const int& num);
private:
    //!是否允许旋转
    bool m_isRotation = true;
    //!旋转的中心点位置
    QPointF m_rotationCenter = QPointF(0,0);
    //!旋转的角度
    qreal m_containerRotation = 0;
    //!容器的变换方向
    Qt::Orientation m_direction = Qt::Orientation::Horizontal;
    //!缩放比例
    qreal m_scaleX = 1;
    qreal m_scaleY = 1;
protected:
    //!包含的图形
    QMap<QString,GY_Object*> m_ChildrensMap;
    //!包含的图形且有序
    QVector<GY_Object*> m_OrderChildrens;
    /**
     * @brief setContainerEditPointF 默认编辑点（矩形的4个点作为编辑点），派生类根据需要重写
     */
    virtual void setContainerEditPointF();
    void setContainerTransform();

    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override;
    QVariant itemChange(GraphicsItemChange change, const QVariant &value) override;
};

#endif // GY_CONTAINERTRANSFORM_H
